package shc.graduation.app;

import android.content.Context;

import com.facebook.cache.disk.DiskCacheConfig;
import com.facebook.common.internal.Supplier;
import com.facebook.common.util.ByteConstants;
import com.facebook.drawee.backends.pipeline.Fresco;
import com.facebook.imagepipeline.cache.MemoryCacheParams;
import com.facebook.imagepipeline.core.ImagePipelineConfig;

import org.litepal.LitePalApplication;
import org.litepal.crud.DataSupport;

import java.util.List;

import shc.graduation.bean.CodeGroup;
import shc.graduation.bean.PaoWangGroup;
import shc.graduation.bean.PaperGroup;
import shc.graduation.utils.log.LogUtils;
import shc.graduation.utils.DisplayUtil;
import shc.graduation.utils.FileUtil;
import shc.graduation.utils.ServerUtil;
import shc.graduation.utils.SharePreferenceUtil;

/**
 * Created by shuhuiChen on  2016/5/19  22:41.
 * Email ：shuhuiCSH@126.com
 */
public class MyApplication extends LitePalApplication {

    //分配的可用内存
    private static final int MAX_HEAP_SIZE = (int) Runtime.getRuntime().maxMemory();
    //使用的缓存数量
    public static final int MAX_MEMORY_CACHE_SIZE = MAX_HEAP_SIZE / 4;

    //小图极低磁盘空间缓存的最大值（特性：可将大量的小图放到额外放在另一个磁盘空间防止大图占用磁盘空间而删除了大量的小图）
    public static final int MAX_SMALL_DISK_VERYLOW_CACHE_SIZE = 5 * ByteConstants.MB;
    //小图低磁盘空间缓存的最大值（特性：可将大量的小图放到额外放在另一个磁盘空间防止大图占用磁盘空间而删除了大量的小图）
    public static final int MAX_SMALL_DISK_LOW_CACHE_SIZE = 10 * ByteConstants.MB;

    //小图磁盘缓存的最大值（特性：可将大量的小图放到额外放在另一个磁盘空间防止大图占用磁盘空间而删除了大量的小图）
    public static final long MAX_SMALL_DISK_CACHE_SIZE = 20 * ByteConstants.MB;
    //默认图极低磁盘空间缓存的最大值
    public static final long MAX_DISK_CACHE_VERYLOW_SIZE = 100 * ByteConstants.MB;
    //默认图低磁盘空间缓存的最大值
    public static final long MAX_DISK_CACHE_LOW_SIZE = 500 * ByteConstants.MB;
    //默认图磁盘缓存的最大值
    public static final long MAX_DISK_CACHE_SIZE = Long.MAX_VALUE - 1;

    //小图所放路径的文件夹名
    private static final String IMAGE_PIPELINE_SMALL_CACHE_DIR = "imagepipeline_cache";
    //默认图所放路径的文件夹名
    private static final String IMAGE_PIPELINE_CACHE_DIR = "ImageCache";

    public static MyApplication mMyApplication = null;

    public MyApplication() {
        super();
    }

    @Override
    public void onCreate() {
        super.onCreate();

        mMyApplication = this;

        Context applicationContext = getApplicationContext();
        ImagePipelineConfig imagePipelineConfig = configureCaches(applicationContext);

        Fresco.initialize(applicationContext, imagePipelineConfig);
        LogUtils.e("Fresco初始化了");

        DisplayUtil.init(mMyApplication);

        new Thread() {
            @Override
            public void run() {
                super.run();
                initArticleGroup();
                initPaperGroup();
            }
        }.start();
    }

    /**
     * 初始化大数据日报分组
     */
    private void initPaperGroup() {
        if (SharePreferenceUtil.getInstance(this).isPaperGroupSave()) {
            return;
        }

        SharePreferenceUtil.getInstance(this).savePaperGroup(true);

        LogUtils.e("开始初始化日报的分组");

        final String groupName = "APP日报,Python日报,大数据日报,机器日报,Web技术日报";

        String[] groupUrlArrays = {ServerUtil.PAPER_APP_URL,
                ServerUtil.PAPER_PYTHON_URL,
                ServerUtil.PAPER_BIGDATA_URL,
                ServerUtil.PAPER_MACHINE_URL,
                ServerUtil.PAPER_WEB_URL};

        String[] groupArrays = groupName.split(",");

        List<PaperGroup> paperGroupList = DataSupport.findAll(PaperGroup.class, true);

        PaperGroup paperGroup = null;

        for (int i = 0, size = groupArrays.length; i < size; i++) {

            boolean isHave = false;
            for (PaperGroup paperGroup1 : paperGroupList) {
                if (paperGroup1.getGroupName().equals(groupArrays[i])) {
                    isHave = true;
                    break;
                }
            }

            if (!isHave) {
                paperGroup = new PaperGroup(groupArrays[i]);
                paperGroup.setGroupUrl(groupUrlArrays[i]);
                paperGroup.setCreateTime(String.valueOf(System.currentTimeMillis()));
                paperGroup.save();
            }
        }

        LogUtils.e("初始化完毕");
    }

    /**
     * 初始化泡网文章
     */
    private void initArticleGroup() {

        if (SharePreferenceUtil.getInstance(this).isPaoWangGroupSave()) {
            return;
        }

        SharePreferenceUtil.getInstance(this).savePaowangGroup(true);

        LogUtils.e("开始初始化泡网的分组");

        CodeGroup codeGroup = new CodeGroup();
        codeGroup.setGroupName("全部");
        codeGroup.save();

        final String groupName = "程序设计,综合资讯,安卓开发,前端开发,IOS开发,数据库,开发日志,应用推荐,每日一站";

        String[] groupUrlArrays = {ServerUtil.PAOWANG_PROGRAM_URL,
                ServerUtil.PAOWANG_NEWS_URL,
                ServerUtil.PAOWANG_ANDROID_URL,
                ServerUtil.PAOWANG_FOREGROUND_URL,
                ServerUtil.PAOWANG_IOS_URL,
                ServerUtil.PAOWANG_DATABASE_URL,
                ServerUtil.PAOWANG_DEVELOP_URL,
                ServerUtil.PAOWANG_APP_URL,
                ServerUtil.PAOWANG_EVERYDAY_URL};

        String[] groupArrays = groupName.split(",");

        List<PaoWangGroup> paoWangGroupList = DataSupport.findAll(PaoWangGroup.class, true);

        PaoWangGroup paoWangGroup = null;

        for (int i = 0, size = groupArrays.length; i < size; i++) {

            boolean isHave = false;
            for (PaoWangGroup group : paoWangGroupList) {
                if (group.getGroupName().equals(groupArrays[i])) {
                    isHave = true;
                    break;
                }
            }

            if (!isHave) {
                paoWangGroup = new PaoWangGroup(groupArrays[i]);
                paoWangGroup.setGroupUrl(groupUrlArrays[i]);
                paoWangGroup.setCreateTime(String.valueOf(System.currentTimeMillis()));
                paoWangGroup.save();
            }
        }

        LogUtils.e("初始化完毕");
    }

    /**
     * 初始化Fresco缓存配置
     *
     * @param context
     * @return
     */
    private static ImagePipelineConfig configureCaches(Context context) {
        final MemoryCacheParams bitmapCacheParams = new MemoryCacheParams(
                MAX_MEMORY_CACHE_SIZE, // 内存缓存中总图片的最大大小,以字节为单位。
                Integer.MAX_VALUE, // 内存缓存中图片的最大数量。
                MAX_MEMORY_CACHE_SIZE, // 内存缓存中准备清除但尚未被删除的总图片的最大大小,以字节为单位。
                Integer.MAX_VALUE, // 内存缓存中准备清除的总图片的最大数量。
                Integer.MAX_VALUE); // 内存缓存中单个图片的最大大小。

        //修改内存图片缓存数量，空间策略（这个方式有点恶心）
        Supplier<MemoryCacheParams> mSupplierMemoryCacheParams = new Supplier<MemoryCacheParams>() {
            @Override
            public MemoryCacheParams get() {
                return bitmapCacheParams;
            }
        };

        //小图片的磁盘配置
        DiskCacheConfig diskSmallCacheConfig = DiskCacheConfig.newBuilder(mMyApplication)
                .setBaseDirectoryPath(context.getApplicationContext().getCacheDir())//缓存图片基路径
                .setBaseDirectoryName(IMAGE_PIPELINE_SMALL_CACHE_DIR)//文件夹名
                .setMaxCacheSize(MAX_SMALL_DISK_CACHE_SIZE)//默认缓存的最大大小。
                .setMaxCacheSizeOnLowDiskSpace(MAX_SMALL_DISK_LOW_CACHE_SIZE)//缓存的最大大小,使用设备时低磁盘空间。
                .setMaxCacheSizeOnVeryLowDiskSpace(MAX_SMALL_DISK_VERYLOW_CACHE_SIZE)//缓存的最大大小,当设备极低磁盘空间
                // .setVersion(version)
                .build();

        //默认图片的磁盘配置
        DiskCacheConfig diskCacheConfig = DiskCacheConfig.newBuilder(mMyApplication)
                .setBaseDirectoryPath(FileUtil.getCacheFile())//缓存图片基路径
                .setBaseDirectoryName(IMAGE_PIPELINE_CACHE_DIR)//文件夹名
                .setMaxCacheSize(MAX_DISK_CACHE_SIZE)//默认缓存的最大大小。
                .setMaxCacheSizeOnLowDiskSpace(MAX_DISK_CACHE_LOW_SIZE)//缓存的最大大小,使用设备时低磁盘空间。
                .setMaxCacheSizeOnVeryLowDiskSpace(MAX_DISK_CACHE_VERYLOW_SIZE)//缓存的最大大小,当设备极低磁盘空间
                // .setVersion(version)
                .build();

        //缓存图片配置
        ImagePipelineConfig.Builder configBuilder = ImagePipelineConfig.newBuilder(context)
                .setBitmapMemoryCacheParamsSupplier(mSupplierMemoryCacheParams)//内存缓存配置（一级缓存，已解码的图片）
                .setMainDiskCacheConfig(diskCacheConfig)//磁盘缓存配置（总，三级缓存）
                .setSmallImageDiskCacheConfig(diskSmallCacheConfig)//磁盘缓存配置（小图片，可选～三级缓存的小图优化缓存）
                ;

        return configBuilder.build();
    }
}
